package com.example.his.api.config.sa_token;


import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

/**
 * SaTokenConfigure 认证授权配置
 */
@Configuration
@Slf4j
public class SaTokenConfigure  implements  WebMvcConfigurer{

    @Resource
    private CorsInterceptor corsInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        //1、添加跨域拦截器
        registry.addInterceptor(corsInterceptor).addPathPatterns("/**");

        //2、satoken 认证授权拦截器
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 指定一条 match 规则
            SaRouter.match("/mis/**")
                    .notMatch("/mis/user/login")        // 排除掉的 path 列表，可以写多个
                    .check(r -> {
                        //检查是否已经登录
                        StpUtil.checkLogin();
                        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
                        log.info("登录用户信息info={}",tokenInfo);
                    });

            // 用户管理权限
            SaRouter.match("/mis/user/**")
                    .notMatch("/mis/user/login")  // 排除掉的 path 列表，可以写多个
                    .notMatch("/mis/user/logout")
                    .check(r -> {
                        StpUtil.checkPermissionOr("ROOT", "USER");
                        });
            // 角色管理权限
            SaRouter.match("/mis/role/**")
                    .check(r -> {
                        StpUtil.checkPermissionOr("ROOT", "ROLE");
                    });
            // 部门管理权限
            SaRouter.match("/mis/dept/**")
                    .check(r -> {
                        StpUtil.checkPermissionOr("ROOT", "DEPT");
                    });
            // 权限模块
            SaRouter.match("/mis/permission/**")
                    .check(r -> {
                        StpUtil.checkPermissionOr("ROOT", "ROLE");
                    });
            // 权限模块
            SaRouter.match("/mis/goods/**")
                    .check(r -> {
                        StpUtil.checkPermissionOr("ROOT", "GOODS");
                    });

        })).addPathPatterns("/**");
    }



    /**
     * 注册跨域信息
     */
//    @Override
//    public void addCorsMappings(CorsRegistry corsRegistry){
//        /**
//         * 所有请求都允许跨域，使用这种配置就不需要
//         * 在interceptor中配置header了
//         */
//        corsRegistry.addMapping("/**")
//                .allowCredentials(true)
//                .allowedOrigins("*")
//                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
//                .allowedHeaders("*")
//                .maxAge(3600);
//    }

}
